22-3 y

讓電腦能夠聽懂人的對話,一直是人類長久以來的夢想。近年來由於電腦速度的提升,語音辨識的應用也越來越普遍,例如智慧型手機的語音應用(如蘋果手機的 Siri 語音助理 或是安卓手機的語音轉文字)、智慧音箱(如 Amazon Alexa、Google Home)等,都是深入人們日常生活的語音辨識實際應用。

語音辨識的應用,可以根據不同的方式來分類。第一種方式,是根據語音辨識系統的使用者來分類:

第二種方式,是根據語音辨識系統的功能來分類,依照難度來區分,可以列出如下::

在建立語音辨識系統之前,我們必須先從語音訊號中切出音框,然後從音框中抽出跟音色相關的特徵,期中最常用的特徵就是 MFCC,這是一個在語音辨識最常用到的特徵,每一個音框通常可以抽出 13、26 或 39 維的 MFCC 向量,這方面的說明或計算代碼,都可以由網路上查到。

Hint

根據上面的分類,最簡單的語音辨識系統,就是「語者相關的語音命令辨識系統」,通常就是「用自己的聲音比對自己的聲音」,例如早期的手機(如 Sony Ericson T18),你可以預錄幾組語音,每一個語音對應到一組電話號碼,例如「拉麵」對應到拉麵店的電話,因此當你對手機喊「拉麵」時,系統會對你輸入的聲音以及已經預錄好的聲音進行比對,若比對正確,手機就會自行撥電話到拉麵店。(但是,對電腦而言,人類的語音變化度極大,若是金城武的妹妹對金城武的手機喊「拉麵」,不見得有效,因為內部用來比對的錄音是金城武的聲音,而不是他妹妹的聲音。)

Hint
T18 的拉麵廣告(使用語者相關的語音命令辨識),2000年:https://www.youtube.com/watch?v=M4hFuUYBGf0

若要建立「語者相關的語音命令辨識」系統,最基本的方法,就是使用動態時間扭曲(dynamic time warping, DTW)來進行比對,這是一個基於動態規劃(dynamic programming, DP)的方法,它可以根據講話的音色來進行比對,同時也會針對不同的語音速度來進行局部伸縮,以達到最好的對位(alignment)效果,示意圖如下。


圖 5.:DTW 比對後所得到的最佳路徑圖。

以上述範例而言,在X軸和Y軸的語音內容都是「清華大學」,但是Y軸的語音比較平穩,X軸的語音則是前面快後面慢,經由 DTW 的對位,可以找到兩者最佳的對位,進而求出兩段語音的最短距離。因此,若要建立一個「語者相關的語音命令辨識系統」,只要請使用者先預錄一組語音命令(每一個語音命令可以錄製多次,例如三次),當使用者發出測試語音時,就可以進行端點偵測(endpoint detection)並計算 MFCC,最後拿這一組 MFCC 和預錄語音命令的 MFCC 來進行 DTW 比對,距離最短的的語音命令,就是我們要找的答案。

而最複雜的語音辨識系統,就是「語者無關的對話系統」,例如蘋果手機的 Siri 語音助理、亞馬遜的 Alexa 智慧音箱,以及 Google Home 語音助理,這些系統就像是虛擬助理般,都可以和人們進行簡單的對話,同時藉由瞭解使用者的意圖,幫忙人們做一些簡單事情,如預定車票、查詢天氣或電影等。若要建構此類系統,那就要改用比較複雜的聲學模型來進行,語音的特徵還是 MFCC,但是我們要使用不同的聲學模型來代表不同的音色(子音或母音等),並根據此聲學模型來算出一個MFCC向量所對應的機率密度(probability density)。舉例來說,我們可以收集 100 人所發出的母音「ㄚ」,切出來音框後,每一個音框再抽抽出 39 維的 MFCC 向量,再使用一個高維度的機率密度函數(probability density function, PDF)來建立這些 MFCC 向量的聲學模型,而建立此模型最常用的方法就是最大似然率估測法(maximum likelihood estimate, MLE)。一般最常用的 PDF 是 GMM (Gaussian mixture models),是由一組高斯機率密度函數(Gaussian PDF)的加權平均所組成,根據最大似然率估測法,我們就可以根據所給的一組 MFCC 向量來計算 GMM 的最佳參數值,包含每一個高斯機率密度函數的平均向量(mean vector)和共變異矩陣(covariance matrix),以及這些函數的加權權重(weighting factors)。

以下是使用高斯 PDF 及 GMM PDF 來對 1-D 資料進行建模的典型範例:


圖 5.:一維高斯 PDF 的範例。


圖 5.:一維 GMM PDF 的範例,此 GMM PDF 由三個高斯 PDF 的加權平均所組成。

以下是使用高斯 PDF 及 GMM PDF 來對 2-D 資料進行建模的典型範例:


圖 5.:二維高斯 PDF 的範例。


圖 5.:二維 GMM PDF 的範例,此 GMM PDF 由四個高斯 PDF 的加權平均所組成。

依照 MLE 的方法,我們也可以對 39-D 的 MFCC 來進行建模,只不過是我們很難用簡單的曲面圖或等高線來檢視建模之後的結果。

Hint
一般PDF所算出來的數值,是機率密度,但是在實際運算中,我們常要對機率密度進行連乘,導致數值越來越小而讓電腦的數值運算容易產生誤差,為了避免此問題,我們通常將機率密度取對數,同時將「連乘」改為「連加」,以降低電腦的數值運算誤差。因此,我們通常將「機率密度的對數值」(log probability density)稱為似然率(likelihood)。

使用 GMM 來建立聲學模型,還是一個比較基本的方法。如果我們考慮發音隨時間而變的情況,那麼使用一個單一的PDF來建立聲學模型是不合理的。例如母音「ㄞ」在發音的過程中,我們的嘴形是連續變化的,基本上是由「ㄚ」變到「ㄧ」,因此若要建立更精準的聲學模型,我們可以改用HMM(hidden Markov models),這是一個用於描述序列(sequences)的機率密度函數,每一個HMM由數個狀態(state)所組成,每一個狀態就是一個靜態的PDF,而狀態之間的轉移可以由轉移機率(transition probability)來表示。以下是一個具有三個狀態的HMM模型的示意圖:


圖 5.:具有三個狀態的 HMM 示意圖。

舉例來說,若使用HMM來代表「ㄞ」的聲學模型,那我我們可以使用3個狀態,每一個狀態就是由一個GMM來代表,狀態之間的轉移可以使用一個 3x3 的轉移機率矩陣(transition probability matrix)來代表。這個聲學模型的參數(包含三個GMM的參數以及轉移機率矩陣),也是由MLE的方法來計算得出,但由於事先並不知道每一個音框的MFCC向量是屬於哪一個狀態,因此在實做上必須逐次進行分配,最後達大最大的似然率,這個方法稱為分斷式 k-means (segmental k-means),步驟如下:
  1. 對於每一個語句,使用DP來將語句的MFCC向量分配到每一個狀態。
  2. 對於每一個狀態,根據被分派到的所有MFCC向量來計算對應的GMM最佳參數。
  3. 根據每一個音框所被分配到的狀態,來計算轉移機率矩陣。
  4. 跳回步驟一,直到所有的參數收斂。

使用HMM來表示一個聲學模型,通常得到的效果會更好,因為它能夠表示一個發音隨時間而變化的現象。

在實際辨識系統中,我們通常會更仔細地將所有發音區分為更基本的基本發音單位,稱為音素(phoeme),這是人類語音中,能夠區別不同發音的最小聲音單位,因此我們會根據音素來建立聲學模型,而不是單以注音符號中的子音或母音來建立模型。例如:

例如,若不考慮聲調,「你好」的注音符號是「ㄋㄧ-ㄏㄠ」,漢語拼音是「ni-hao」,轉換成音素的結果則都是「n_i-h_a_u」。

此外,為了能夠更精準地抓出不同的發音,我們會將音素再細分各種情況來進行聲學模型的建模,以「平安」(ㄆㄧㄥ-ㄢ 或 ping-an)為例:

可以想見,使用monophone來建立的聲學模型會比較粗略,但是佔用空間小,且需要的訓練資料量和計算資源需求都比較少;而使用triphone建立的聲學模型會比較精緻,但是佔用空間大,且需要的訓練資料量和計算資源需求都會相對比較大。

因此,對於一句文句,我們可以先轉出拼音,然後根據拼音轉出音素序列,然後就可以將音素序列再轉換成HMM聲學模型的串接。若以文句「你好」來說明,建立biphone sequence(不考慮 leading silence)的步驟如下:

  1. 轉拼音:你好 ==> ㄋㄧ-ㄏㄠ 或 ni-hao
  2. 轉音素:ㄋㄧ-ㄏㄠ 或 ni-hao ==> n_i-h_a_u
  3. 轉biphone: n+i, i+h, h+a, a+u, u+sil
  4. 串接成HMM模型,如下:


    圖 5.:對應到「你好」的 HMM 模型示意圖。

針對一句語音,我們可以先算出對應的MFCC向量組,然後就可以將這個向量組送到這個串接的聲學模型,使用 Viterbi search (這也是一種DP的方法)來得到這個語音對於這個HMM的最大似然率,我們可以想像這個過程類似在填表,當我們完成填表,就可以知道每個音框要分配到哪一個狀態,才能得到似然率的最大值,圖形說明如下:


圖 5.:我們可以使用 Viterbi search 將每一個音框分配到 HMM 的狀態,以得到最大的似然率。

由 Viterbi search 所得到的似然率,可以想像成是語音與文句的符合程度,似然率越高,代表這一段語音訊號越有可能是對應到這一個文句。若有可辨識的n個命令文句,我們就可以算出n個似然率,似然率最高的文句,就對應到語音命令辨識的最可能結果,這就是「語者無關的語音命令辨識」的基本原理。在系統實作時,這個表格可能很大(例如十秒的語音就大約會有1000個音框,5個字的文句就會產生大約30個HMM的狀態(假設每個字平均由6個HMM狀態來代表),因此你就必須對3萬個儲存格進行填表),若是可辨識命令有一萬個文句(平均每一句有5個字),那整體運算就需要填入3億個儲存格!在實際運算時,我們通常還會進行各種優化及簡化,以便能夠達到即時辨識的要求。

如果我們更進一步想進行更複雜的「聽寫」,那就要考慮到每個人講話時,到底會用到哪一些詞,以及這些詞在串接時的可能性。用來計算這些可能性的數學模型稱為「語言模型」(language model),和之前所說明的聲學模型剛好在語音辨識扮演相輔相成的角色。一般的語言模型是以 n-gram 模型為主,n-gram 就是n個詞的串接,因此簡單地說,一個模型可以計算一組詞串接在一起的機率。以英文為例,若一句語音被辨識成兩種可能:

這兩個文句的發音相當接近,但是我們若啟用語言模型,就會知道一般人會講「wrech a nice beach」的機率遠低於「recognize speech」,因此電腦應該會選擇第一個文句為辨識結果,這也是我們要的正確答案。在實際運算時,我們通常還會以樹(trees)或圖(graphs)來建立更複雜的資料結構(例如 word lattice),並在此資料結構進行各種搜尋及優化,以期望在可忍受的時間內(如一秒)能夠回傳辨識結果,但這方面牽涉相當多資料結構和演算法的細節,在此不再贅述。典型的 word lattice 範例如下(來源:http://berlin.csie.ntnu.edu.tw/SpeechProject/Research/Transcription/Acoustic_Lookahead.htm):


圖 5.:典型的 word lattice,可加入語言模型以計算辨識結果。

上述使用HMM的方法,已經被用了數十年,但是近期流行的DNN(deep neural networks)方法,所的到的辨識效果更好,但是需要的計算量更大,其基本概念是使用DNN來取代GMM(因此原來的GMM-HMM的架構就被取代成 DNN-HMM),並使用GPU來進行大量的優化運算,所以才能得到更好的辨識效果。


Audio Signal Processing and Recognition (音訊處理與辨識)